Use case: SPI transmit in DMA mode

Sequence diagram

SPI transmit in DMA mode

  @startuml
  "Application"->"SPI" : HAL_SPI_Transmit_DMA(&hspi1, aTxBuffer, DATA_TO_SEND);
  "SPI"-> "DMA" : HAL_DMA_Start_IT(&hspi1);
  "DMAx_IRQHandler" <- : DMAx half complete interrupt
  "DMAx_IRQHandler" -> "DMA" : HAL_DMA_IRQHandler(&hspi1);
  "DMA" -> "SPI" : XferHalfCpltCallback(&hspi1);

  "SPI"-> "Application" : HAL_SPI_RegisterCallback(&hspi1, HAL_SPI_TX_COMPLETE_CB_ID, USER_SPI_TxCpltCallback);
  @enduml

Code snippet

HAL1

HAL2

#define DATA_TO_SEND   256
#define DATA_TO_RECEIVE DATA_TO_SEND
SPI_HandleTypeDef hspi1;
uint8_t aTxBuffer[] = "*** SPI communication based on DMA mode ***"

HAL_SPI_RegisterCallback(&hspi1, HAL_SPI_TX_COMPLETE_CB_ID, USER_SPI_TxCpltCallback);

HAL_SPI_Transmit_DMA(&hspi1, aTxBuffer, DATA_TO_SEND);
#define DATA_TO_SEND   256
#define DATA_TO_RECEIVE DATA_TO_SEND
hal_spi_handle_t hspi1;
uint8_t aTxBuffer[] = "*** SPI communication based on DMA mode ***"

HAL_SPI_RegisterTxCpltCallback(&hspi1, USER_SPI_TxCpltCallback);

HAL_SPI_Transmit_DMA(&hspi1, aTxBuffer, DATA_TO_SEND);

Key changes

  1. TX complete callback registration changes from HAL_SPI_RegisterCallback(..., HAL_SPI_TX_COMPLETE_CB_ID, ...) to HAL_SPI_RegisterTxCpltCallback().

  2. HAL2 uses hal_spi_handle_t instead of SPI_HandleTypeDef.